电商网站前端开发教程

1. Vue.js 简介和特性

1.1 Vue.js 是什么?

Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它易于上手,同时提供了丰富的功能,如数据绑定、组件化、路由和状态管理等。

1.2 Vue.js 的特性

  • 响应式数据绑定:数据与视图自动同步。
  • 组件化:将页面拆分为多个可复用的组件。
  • 虚拟 DOM:提高渲染性能。
  • 丰富的生态系统:包括 Vue Router、Vuex 等。

2. 开发环境搭建

2.1 安装 Node.js 和 npm

首先,确保你已经安装了 Node.js 和 npm。你可以通过以下命令检查是否安装:

node -v
npm -v

2.2 使用 Vue CLI 创建项目

Vue CLI 是一个官方提供的脚手架工具,可以帮助你快速搭建 Vue 项目。

npm install -g @vue/cli
vue create my-project

2.3 使用 Vite 创建项目

Vite 是一个更快的构建工具,适合现代前端开发。

npm init vite@latest my-project --template vue

3. 创建第一个 Vue 应用

3.1 项目结构

创建项目后,你会看到以下结构:

my-project/
├── public/
├── src/
│   ├── assets/
│   ├── components/
│   ├── App.vue
│   ├── main.js
├── package.json

3.2 运行项目

进入项目目录并启动开发服务器:

cd my-project
npm run dev

3.3 修改 App.vue

打开 src/App.vue,修改内容如下:

<template>
  <div id="app">
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    }
  }
}
</script>

<style>
#app {
  text-align: center;
  margin-top: 60px;
}
</style>

4. Vue 实例和生命周期

4.1 Vue 实例

每个 Vue 应用都是通过创建一个 Vue 实例开始的:

new Vue({
  el: '#app',
  data: {
    message: 'Hello, Vue!'
  }
})

4.2 生命周期钩子

Vue 实例有一系列生命周期钩子,如 created、mounted、updated 和 destroyed。

new Vue({
  data: {
    message: 'Hello, Vue!'
  },
  created() {
    console.log('Vue instance created')
  },
  mounted() {
    console.log('Vue instance mounted')
  }
})

5. 模板语法和数据绑定

5.1 插值

使用双大括号 {{ }} 进行文本插值:

<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

5.2 指令

Vue 提供了多种指令,如 v-bind、v-on、v-if 等。

<template>
  <div>
    <p v-if="showMessage">{{ message }}</p>
    <button v-on:click="toggleMessage">Toggle Message</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!',
      showMessage: true
    }
  },
  methods: {
    toggleMessage() {
      this.showMessage = !this.showMessage
    }
  }
}
</script>

6. 组件化开发

6.1 创建组件

在 src/components/ 目录下创建一个新组件 HelloWorld.vue:

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
  </div>
</template>

<script>
export default {
  props: {
    title: String,
    content: String
  }
}
</script>

6.2 使用组件

在 App.vue 中引入并使用该组件:

<template>
  <div id="app">
    <HelloWorld title="Welcome" content="This is a Vue component." />
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  components: {
    HelloWorld
  }
}
</script>

7. 组件通信

7.1 Props

父组件通过 props 向子组件传递数据:

<template>
  <div>
    <ChildComponent :message="parentMessage" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent'
    }
  }
}
</script>

7.2 Events

子组件通过 $emit 向父组件发送事件:

<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Hello from child')
    }
  }
}
</script>

7.3 Provide/Inject

用于跨层级组件通信:

<script>
export default {
  provide() {
    return {
      message: 'Hello from root'
    }
  }
}
</script>

子组件中使用 inject 接收数据:

<script>
export default {
  inject: ['message'],
  created() {
    console.log(this.message) // 'Hello from root'
  }
}
</script>

8. 计算属性和侦听器

8.1 计算属性

计算属性用于处理依赖数据的变化:

<template>
  <div>
    <p>{{ fullName }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName() {
      return `${this.firstName} ${this.lastName}`
    }
  }
}
</script>

8.2 侦听器

侦听器用于监听数据的变化并执行相应操作:

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    }
  },
  watch: {
    message(newVal, oldVal) {
      console.log(`Message changed from ${oldVal} to ${newVal}`)
    }
  }
}
</script>

9. 条件渲染和列表渲染

9.1 条件渲染

使用 v-if、v-else-if 和 v-else 进行条件渲染:

<template>
  <div>
    <p v-if="showMessage">{{ message }}</p>
    <p v-else>No message to display</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showMessage: true,
      message: 'Hello, Vue!'
    }
  }
}
</script>

9.2 列表渲染

使用 v-for 进行列表渲染:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    }
  }
}
</script>

10. 表单输入绑定

10.1 单向绑定

使用 v-model 进行表单输入的双向绑定:

<template>
  <div>
    <input v-model="message" placeholder="Enter a message">
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

10.2 修饰符

v-model 支持多种修饰符,如 .lazy、.number 和 .trim:

<template>
  <div>
    <input v-model.lazy="message" placeholder="Enter a message">
    <p>{{ message }}</p>
  </div>
</template>

11. 单文件组件 (.vue 文件)

11.1 结构

单文件组件将模板、脚本和样式封装在一个文件中:

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: 'Hello, Vue!',
      content: 'This is a Vue component.'
    }
  }
}
</script>

<style scoped>
h1 {
  color: blue;
}
</style>

11.2 Scoped CSS

使用 scoped 属性使样式仅作用于当前组件:

<style scoped>
h1 {
  color: blue;
}
</style>

12. 组件注册

12.1 全局注册

在 main.js 中全局注册组件:

import Vue from 'vue'
import App from './App.vue'
import HelloWorld from './components/HelloWorld.vue'

Vue.component('HelloWorld', HelloWorld)

new Vue({
  render: h => h(App),
}).$mount('#app')

12.2 局部注册

在组件中局部注册:

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  components: {
    HelloWorld
  }
}
</script>

13. CSS 预处理器

13.1 安装 Sass

安装 sass-loader 和 node-sass:

npm install sass-loader node-sass --save-dev

13.2 使用 Sass

在 .vue 文件中使用 Sass:

<style lang="scss">
$primary-color: #42b983;

h1 {
  color: $primary-color;
}
</style>

14. 动态样式和类绑定

14.1 动态类绑定

使用 v-bind:class 动态绑定类:

<template>
  <div :class="{ active: isActive }">
    <p>This is a dynamic class example.</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isActive: true
    }
  }
}
</script>

<style>
.active {
  background-color: yellow;
}
</style>

14.2 动态样式绑定

使用 v-bind:style 动态绑定样式:

<template>
  <div :style="{ color: textColor, fontSize: fontSize + 'px' }">
    <p>This is a dynamic style example.</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      textColor: 'red',
      fontSize: 20
    }
  }
}
</script>

15. Vue Router

15.1 安装 Vue Router

安装 vue-router:

npm install vue-router

15.2 配置路由

在 src/router/index.js 中配置路由:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

Vue.use(VueRouter)

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

const router = new VueRouter({
  routes
})

export default router

15.3 使用路由

在 main.js 中引入并使用路由:

import Vue from 'vue'
import App from './App.vue'
import router from './router'

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

16. Vuex 状态管理

16.1 安装 Vuex

安装 vuex:

npm install vuex

16.2 创建 Store

在 src/store/index.js 中创建 Store:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment')
    }
  }
})

16.3 使用 Store

在 main.js 中引入并使用 Store:

import Vue from 'vue'
import App from './App.vue'
import store from './store'

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')

17. 混入 (Mixins)

17.1 创建混入

创建一个混入文件 src/mixins/exampleMixin.js:

export default {
  data() {
    return {
      message: 'Hello from mixin'
    }
  },
  methods: {
    showMessage() {
      alert(this.message)
    }
  }
}

17.2 使用混入

在组件中使用混入:

<script>
import exampleMixin from '../mixins/exampleMixin'

export default {
  mixins: [exampleMixin],
  methods: {
    handleClick() {
      this.showMessage()
    }
  }
}
</script>

18. 自定义指令

18.1 全局自定义指令

在 main.js 中定义全局自定义指令:

Vue.directive('focus', {
  inserted: function(el) {
    el.focus()
  }
})

18.2 局部自定义指令

在组件中定义局部自定义指令:

<script>
export default {
  directives: {
    focus: {
      inserted: function(el) {
        el.focus()
      }
    }
  }
}
</script>

19. 插件系统

19.1 创建插件

创建一个插件文件 src/plugins/examplePlugin.js:

export default {
  install(Vue, options) {
    Vue.prototype.$example = function() {
      alert('Hello from plugin')
    }
  }
}

19.2 使用插件

在 main.js 中引入并使用插件:

import Vue from 'vue'
import App from './App.vue'
import examplePlugin from './plugins/examplePlugin'